#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**
 * mat基本运算
 */
int main(){
    cv::Mat src = cv::imread("../resource/wukong.jpg");
    if(src.empty()){
        cout << "read image failed!" << endl;
        return -1;
    }

    cv::Mat dst;
    dst = src + cv::Scalar(50,50,50); //所有像素点都加上这个标量

    // cv::imshow("src", src);
    // cv::imshow("dst", dst);
    // cv::waitKey(0);


    cv::Mat dst2 = cv::Mat::zeros(src.size(), src.type()); //创建一个全是0的mat，长宽与图片相同，通道和图片也相同
    dst2 = cv::Scalar(2,2,2); //这句话的意思是在上面定义的基础上将所有点的值都修改为2
    cv::multiply(src,dst2,dst); //这里是将src和dst2相乘，然后赋值给dst

    // cv::imshow("dst", dst);
    // cv::waitKey(0);
    // cv::destroyAllWindows();

    //还可以通过数组遍历来实现给所有点做加法的效果
    cv:Mat dst3 = cv::Mat::zeros(src.size(), src.type());
    dst3 = cv::Scalar(50,50,50);
    dst = cv::Mat::zeros(src.size(), src.type());

    for (int i=0;i<src.rows;i++) {
        for (int j=0;j<src.cols;j++) {
            //获取原始图像的像素
            cv::Vec3b& pixel = src.at<cv::Vec3b>(i,j);
            //获取dst3的像素
            cv::Vec3b& dpixel = dst3.at<cv::Vec3b>(i,j);

            dst.at<cv::Vec3b>(i,j)[0] = cv::saturate_cast<uchar>(pixel[0] + dpixel[0]); //这里使用saturate_cast是为了防止相加时数据超过255而溢出
            dst.at<cv::Vec3b>(i,j)[1] = cv::saturate_cast<uchar>(pixel[1] + dpixel[1]);
            dst.at<cv::Vec3b>(i,j)[2] = cv::saturate_cast<uchar>(pixel[2] + dpixel[2]);
        }
    }

    // cv::imshow("dst",dst);
    // cv::waitKey(0);
    // cv::destroyAllWindows();
    

    //最后，最简单的方法是可以通过api来实现加减乘除
    cv::Mat dst4=cv::Mat::zeros(src.size(),src.type());
    dst4 = cv::Scalar(50,50,50);

    // cv::add(src,dst4,dst);
    // cv::subtract(src,dst4,dst);
    // cv::divide(src,dst4,dst);
    // cv::multiply(src,dst4,dst);

    // cv::imshow("dst",dst);
    // cv::waitKey(0);
    // cv::destroyAllWindows();

    return 0;
}